 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial implementation
  * Red Hat, Inc - Extracted methods from WizardArchiveFileResourceImportPage1
  *******************************************************************************/

 package org.eclipse.ui.internal.wizards.datatransfer;

 import java.io.IOException ;
 import java.util.zip.ZipFile ;

 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;

 /**
  * @since 3.1
  */
 public class ArchiveFileManipulations {

     private static ZipLeveledStructureProvider zipProviderCache;

     private static TarLeveledStructureProvider tarProviderCache;

     /**
      * Determine whether the file with the given filename is in .tar.gz or .tar
      * format.
      *
      * @param fileName
      * file to test
      * @return true if the file is in tar format
      */
     public static boolean isTarFile(String fileName) {
         if (fileName.length() == 0) {
             return false;
         }

         try {
             new TarFile(fileName);
         } catch (TarException tarException) {
             return false;
         } catch (IOException ioException) {
             return false;
         }

         return true;
     }

     /**
      * Determine whether the file with the given filename is in .zip or .jar
      * format.
      *
      * @param fileName
      * file to test
      * @return true if the file is in tar format
      */
     public static boolean isZipFile(String fileName) {
         if (fileName.length() == 0) {
             return false;
         }

         try {
             new ZipFile (fileName);
         } catch (IOException ioException) {
             return false;
         }

         return true;
     }

     /**
      * Clears the cached structure provider after first finalizing it properly.
      *
      * @param shell
      * The shell to display any possible Dialogs in
      */
     public static void clearProviderCache(Shell shell) {
         if (zipProviderCache != null) {
             closeZipFile(zipProviderCache.getZipFile(), shell);
             zipProviderCache = null;
         }
         tarProviderCache = null;
     }

     /**
      * @param targetZip
      * @param shell
      * @return the structure provider
      */
     public static ZipLeveledStructureProvider getZipStructureProvider(
             ZipFile targetZip, Shell shell) {
         if (zipProviderCache == null) {
             zipProviderCache = new ZipLeveledStructureProvider(targetZip);
         } else if (!zipProviderCache.getZipFile().getName().equals(
                 targetZip.getName())) {
             clearProviderCache(shell);
             // ie.- new value, so finalize&remove old value
 zipProviderCache = new ZipLeveledStructureProvider(targetZip);
         } else if (!zipProviderCache.getZipFile().equals(targetZip)) {
             // duplicate handle to same zip
 // dispose old zip and use new one in case old one is closed
 zipProviderCache = new ZipLeveledStructureProvider(targetZip);
         }

         return zipProviderCache;
     }

     /**
      * Attempts to close the passed zip file, and answers a boolean indicating
      * success.
      *
      * @param file
      * The zip file to attempt to close
      * @param shell
      * The shell to display error dialogs in
      * @return Returns true if the operation was successful
      */
     public static boolean closeZipFile(ZipFile file, Shell shell) {
         try {
             file.close();
         } catch (IOException e) {
             displayErrorDialog(DataTransferMessages.ZipImport_couldNotClose,
                     shell);
             return false;
         }

         return true;
     }

     /**
      * Returns a structure provider for the specified tar file.
      *
      * @param targetTar
      * The specified tar file
      * @param shell
      * The shell to display dialogs in
      * @return the structure provider
      */
     public static TarLeveledStructureProvider getTarStructureProvider(
             TarFile targetTar, Shell shell) {
         if (tarProviderCache == null) {
             tarProviderCache = new TarLeveledStructureProvider(targetTar);
         } else if (!tarProviderCache.getTarFile().getName().equals(
                 targetTar.getName())) {
             ArchiveFileManipulations.clearProviderCache(shell);
             // ie.- new value, so finalize&remove old value
 tarProviderCache = new TarLeveledStructureProvider(targetTar);
         }

         return tarProviderCache;
     }

     /**
      * Display an error dialog with the specified message.
      *
      * @param message
      * the error message
      */
     protected static void displayErrorDialog(String message, Shell shell) {
         MessageDialog.openError(shell, getErrorDialogTitle(), message);
     }

     /**
      * Get the title for an error dialog. Subclasses should override.
      */
     protected static String getErrorDialogTitle() {
         return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
     }
 }

